
class MayBe {
    static of (value) {
        return new MayBe(value)
    }

    constructor(value) {
        this._value = value
    }

    map(fn) {
        return this.isNothing() ? MayBe.of(null) : MayBe.of(fn(this._value))
    }

    isNothing() {
        return this._value === null || this._value === undefined
    }
}

const r = MayBe.of(null).map(x => x.toUpperCase())

console.log(r)

const s = MayBe.of('aaa')
            .map(x => x.toUpperCase())
            .map(x => null)
            .map(x => x.split('.'))
// MayBe 函子的缺陷是当中间的 map 出现null，无法判断哪一个 map 出现的 null